银行家算法避免死锁
要求:
- 完成程序数据结构的设计,数据的录入。
- 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示。
- 完成某进程请求资源试分配。
- 完成安全性检查。
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define Status int
#define true 1
#define false 0
int M=100;//进程的最大数为100
int N=100;//资源的最大数为100
int Claim[100][100]={0};//各进程所需各类资源的最大需求
int Available[100]={0};//系统可用资源
char name[100]={0};//资源的名称
int Allocation[100][100]={0};//系统已分配资源
int Need[100][100]={0};//还需要资源
int Request[100][100]={0};//请求资源向量
int finish[100]={0};//存放安全序列
int Work[100]={0};//存放系统可提供资源
- 1. 试探分配
当进程pi提出资源申请时,系统执行下列步骤:
(1)若Request[i][j]≤Need[i][j],转(2);
否则错误返回
(2)若Request[i][j]≤Available[j],
转(3);否则进程等待
(3)试探着把资源分配给进程Pi,则有:
Available[j]=Available[j]-Request[i][j];
Allocation[i],[j]=Allocation[i],[j]+Request[i][j];
Need[i],[j]=Need[i],[j]-Request[i][j];
- 2. 安全性检测算法:
n 借助于死锁的安全性测试算法来实现。
n 定义布尔型向量finish[k],k=1,..,n。检测死锁算法如下:
(1)Work= Available
(2)在剩余的进程集合中查每一个进程Pk,如果Claim[k,*]- Allocation [k,*]=0,则finish[k]:=true;否则finish[k]:=false;这里k=1,..,n
(3)在剩余的进程集合中找一个进程Pk,需满足条件:
finish[k]=false&(request[*]≤Work)
找到这样的Pk便转(4);否则转(5)
(4)Work:= Work + Allocation;finish[k]:=true;然后转(3)
(5) 如果对k=1,..,n若finish[k]=true不成立,那么,系统出现了死锁,并且finish[k]=false的Pk为死锁进程。
1 #include<iostream.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<stdio.h> 5 #define Status int 6 #define true 1 7 #define false 0 8 int M=100;//进程的最大数为100 9 int N=100;//资源的最大数为100 10 int Claim[100][100]={0};//各进程所需各类资源的最大需求 11 int Available[100]={0};//系统可用资源 12 char name[100]={0};//资源的名称 13 int Allocation[100][100]={0};//系统已分配资源 14 int Need[100][100]={0};//还需要资源 15 int Request[100][100]={0};//请求资源向量 16 int finish[100]={0};//存放安全序列 17 int Work[100]={0};//存放系统可提供资源 18 void write(); 19 20 main() 21 { 22 write(); 23 } 24 25 void write() 26 { 27 char s; 28 int i,j; 29 FILE* fp=fopen("C:\\io.txt","w"); 30 31 printf("请输入进程数:\n"); 32 scanf("%d",&M); 33 fprintf(fp,"\n%d",M); 34 35 printf("请输入资源数:\n"); 36 scanf("%d",&N); 37 fprintf(fp,"\n%d",N); 38 39 40 for(i=0;i<M;i++) 41 { 42 for(j=0;j<N;j++) 43 { 44 45 printf("请输入%d进程所需%d资源的最大需求:\n",i+1,j+1); 46 scanf("%d",&Claim[j][i]); 47 fprintf(fp,"\n%d",Claim[j][i]); 48 } 49 } 50 51 for(i=0;i<N;i++) 52 { 53 printf("请输入%d资源的最大需求:\n",i+1); 54 scanf("%d",&Available[i]); 55 fprintf(fp,"\n%d",Available[i]); 56 } 57 58 59 fclose(fp); 60 }